﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using BitBox.Framework.Util;
using BitBox.Framework.KBR.Model;
using BitBox.Framework.KBR.Model.Entity;

namespace BitBox.Framework.KBR.DAL
{
    public class ConhecimentoDAL
    {
        #region /* Atributos Privados */

        private dcKBRDataContext dc;

        #endregion



        #region /* Métodos Privados */

        private IQueryable<fnTbConhecimentoResult> Select()
        {
            try
            {
                var result = (from Con in dc.fnTbConhecimento()
                              select Con);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion



        #region /* Métodos Públicos */

        /// <summary>
        /// Seleciona com base no info, filtrando de acordo com os campos preenchidos
        /// </summary>
        /// <param name="info"></param>
        /// <returns>Retorna uma lista</returns>
        public List<ConhecimentoInfo> SelectByAnyFilters(ConhecimentoInfo info)
        {
            List<ConhecimentoInfo> retorno = new List<ConhecimentoInfo>();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Con in Select()
                              select Con);
                // Se ID_CONHECIMENTO vier preenchido, acrescenta where
                if (!info.ID_CONHECIMENTO.Equals(0))
                    result = result.Where(re => re.ID_CONHECIMENTO.Equals(info.ID_CONHECIMENTO));
                // Se DESCRICAO vier preenchido, acrescenta where
                if (!String.IsNullOrEmpty(info.DESCRICAO))
                    result = result.Where(re => re.DESCRICAO.Contains(info.DESCRICAO));

                retorno = LinqHelper<ConhecimentoInfo, fnTbConhecimentoResult>.ListResultToInfo(result.ToList<fnTbConhecimentoResult>());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Seleciona com base no ID_CONHECIMENTO
        /// </summary>
        /// <param name="ConId"></param>
        /// <returns>Retorna um elemento Info</returns>
        public ConhecimentoInfo SelectByCode(int ConId)
        {
            ConhecimentoInfo retorno = new ConhecimentoInfo();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Con in Select()
                              where Con.ID_CONHECIMENTO == ConId
                              select Con);

                ConhecimentoInfo info = new ConhecimentoInfo(result.SingleOrDefault());

                retorno = new ConhecimentoInfo(info);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Seleciona com base no DESCRICAO
        /// </summary>
        /// <param name="UserName"></param>
        /// <returns>Retorna um elemento Info</returns>
        public ConhecimentoInfo SelectByDescricao(String ConhecimentoDescricao)
        {
            ConhecimentoInfo retorno = new ConhecimentoInfo();

            try
            {
                dc = DALHelper.GetDataContext();

                var result = (from Con in Select()
                              where Con.DESCRICAO == ConhecimentoDescricao
                              select Con);

                ConhecimentoInfo info = new ConhecimentoInfo(result.SingleOrDefault());

                retorno = new ConhecimentoInfo(info);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return retorno;
        }

        /// <summary>
        /// Executa um Insert com base nas informações de um elemento Info
        /// </summary>
        /// <param name="info"></param>
        /// <returns>Retorna o Identity</returns>
        public int Insert(ConhecimentoInfo info)
        {
            int ConId = 0;

            try
            {
                dc = DALHelper.GetDataContext();

                ConId = dc.PR_TB_CONHECIMENTO_INSERT
                    (
                        info.DESCRICAO
                    );
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
            return ConId;
        }

        /// <summary>
        /// Executa um Update com base nas informações de um elemento Info
        /// </summary>
        /// <param name="info"></param>
        public int Update(ConhecimentoInfo info)
        {
            int ConId = 0;

            try
            {
                dc = DALHelper.GetDataContext();

                ConId = dc.PR_TB_CONHECIMENTO_UPDATE
                       (
                           info.ID_CONHECIMENTO,
                           info.DESCRICAO
                       );
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }

            return ConId;
        }

        /// <summary>
        /// Executa um Delete com base no ID_CONHECIMENTO enviado
        /// </summary>
        /// <param name="ConId"></param>
        public void Delete(int ConId)
        {
            try
            {
                dc = DALHelper.GetDataContext();

                dc.PR_TB_CONHECIMENTO_DELETE(ConId);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dc.Dispose();
            }
        }

        #endregion
    }
}
